package cn.edu.ctbu.web.helper;


import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.Map;

@Setter
@Getter
@Data
/**
 * 自定义响应结果类
 */
public class R {
    /**
     * 错误代码
     */
    private Integer code;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 具体的内容
     */
    private Object data;

    /**
     * 无参构造函数，默认设置成功状态
     */
    public R() {
        this.code = 1;
        this.msg = "操作成功";
    }

    /**
     * 返回错误结果，使用默认错误代码
     * @return 错误结果对象
     */
    public static R error() {
        return error(-1, "操作失败");
    }

    /**
     * 返回带自定义消息的错误结果
     * @param msg 错误消息
     * @return 错误结果对象
     */
    public static R error(String msg) {
        return error(-1, msg);
    }

    /**
     * 返回带自定义错误代码和消息的错误结果
     * @param code 错误代码
     * @param msg 错误消息
     * @return 错误结果对象
     */
    public static R error(Integer code, String msg) {
        R r = new R();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

    /**
     * 返回成功结果
     * @return 成功结果对象
     */
    public static R ok() {
        return new R();
    }

    /**
     * 返回带数据的成功结果
     * @param map 包含数据的Map
     * @return 成功结果对象
     */
    public static R ok(Map<String, Object> map) {
        R r = new R();
        r.putAll(map);
        return r;
    }

    /**
     * 将Map中的数据设置到当前对象中
     * @param map 包含数据的Map
     */
    private void putAll(Map<String, Object> map) {
        if (map != null) {
            if (map.containsKey("code")) {
                this.setCode((Integer) map.get("code"));
            }
            if (map.containsKey("msg")) {
                this.setMsg((String) map.get("msg"));
            }
            if (map.containsKey("data")) {
                this.setData(map.get("data"));
            }
        }
    }

    /**
     * 设置单个属性值
     * @param key 属性名
     * @param value 属性值
     */
    public void put(String key, Object value) {
        if ("code".equals(key)) {
            this.setCode((Integer) value);
        } else if ("msg".equals(key)) {
            this.setMsg((String) value);
        } else if ("data".equals(key)) {
            this.setData(value);
        }
    }

    // Getter 和 Setter 方法
    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
